МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
ЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
/
Лабораторна робота №7
з курсу
”Засоби системного програмування”
Багатомодульне програмування.
Львів – 2012
Мета: Оволодіти навиками створення багатомодульних програм. Засвоїти правила взаємодії різних модулів.
Завдання:
15
X=A2-K+C4/D2-E1*F1
4019
Вміст файлу main.asm
DOSSEG
EXTRN Input :FAR, Calculation :FAR, Output :FAR
PUBLIC erFlag
STACKSG SEGMENT PARA STACK 'Stack'
DW 127 DUP(0)
STACKSG ENDS
DATASG SEGMENT PARA PUBLIC 'Data'
erFlag DB 0
DATASG ENDS
CODESG SEGMENT PARA PUBLIC 'Code'
main:
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG
MOV AX,DATASG
MOV DS,AX
CALL Input
cmp erFlag,0
jne A30
CALL Calculation
cmp erFlag,0
jne A30
CALL Output
cmp erFlag,0
jne A30
A30:
mov ah,4Ch
int 21h
CODESG ENDS
END main
Вміст файлу input.asm
DOSSEG
EXTRN erFlag:BYTE
PUBLIC B,C,D,E,F
MY_MUL MACRO X,Y,Z
mov z,0
mov z+2,0
MOV AX,X
MUL Y
MOV Z,AX
MOV Z+2,DX
MOV AX,X+2
MUL Y
ADD Z+2,AX
mov ax,Z
mov dx,Z+2
ENDM
DATASG SEGMENT PARA PUBLIC 'Data'
B dd 00h
C dw 00h
D dw 00h
E db 00h
F dw 00h
TempStr db 10 dup (0)
TempBin dw 0,0
MaxLen dw 0
Mult10 dw 1,0
my_z dw 0,0
MESSG_X DB 13,10, X=A2-K+C4/D2-E1*F1 К=4019 (7055E0AC)','$'
MESSG_B DB 13,10,'B= ','$'
MESSG_C DB 13,10,'C= ','$'
MESSG_D DB 13,10,'D= ','$'
MESSG_E DB 13,10,'E= ','$'
MESSG_F DB 13,10,'F= ','$'
MESSG_X1 DB 13,10,'X= ','$'
erStr1 db 13,10,'Data not input_variable',13,10,'$'
erStr2 db 13,10,'Incorrectly data ',13,10,'$'
erStr2_1 db 13,10,' D =0 --> divide by zero ',13,10,'$'
erStr3 db 13,10,'Data is too long ',13,10,'$'
DATASG ENDS
CODESG SEGMENT PARA PUBLIC 'CODE'
ASSUME DS:DATASG, CS:CODESG
input proc FAR
public Input
LEA DX,MESSG_X
MOV AH,09
INT 21H
LEA DX,MESSG_B
MOV AH,09
INT 21H
mov di,offset B
mov MaxLen,3
mov cx,MaxLen
call input_variable
LEA DX,MESSG_C
MOV AH,09
INT 21H
mov di,offset C
mov MaxLen,5
mov cx,MaxLen
call input_variable
LEA DX,MESSG_D
MOV AH,09
INT 21H
mov di,offset D
mov MaxLen,3
mov cx,MaxLen
call input_variable
cmp D,0
jne dali
mov erFlag,1
mov ah,09
mov dx, offset erStr2_1
int 21h
mov ah,4Ch
int 21h
dali: LEA DX,MESSG_E
MOV AH,09
INT 21H
mov MaxLen,3
mov cx,MaxLen
call input_variable
LEA DX,MESSG_F
MOV AH,09
INT 21H
mov di,offset F
mov MaxLen,3
mov cx,MaxLen
call input_variable
ret
input endp
input_variable PROC
mov si,0
In_00:mov ah,01
int 21h
cmp al,0Dh
je In_1
cmp al,'-'
jne In_0
mov erFlag,1
jmp In_00
In_0: mov dl,al
call CHECK_BYTE
mov TempStr[si],dl
inc si
loop In_00
In_1: push si
dec si
cmp cx,MaxLen
jne In_2
LEA DX,erSTR1
MOV AH,09
INT 21H
mov erFlag,1
jmp In_5
In_2: mov bh,0
mov bl,TempStr[si]
MY_MUL Mult10,bx,my_z
add TempBin,ax
adc TempBin+2,dx
mov bh,0
mov bl,10
MY_MUL Mult10,bx,my_z
mov Mult10,ax
mov Mult10+2,dx
dec si
cmp si,0
jge In_2
mov ax,TempBin
mov dx,TempBin+2
pop si
cmp si,MaxLen
jl In_3
cmp MaxLen,10
jl In_2_1
js In_Err
cmp dx,0FFFFh
ja In_Err
jmp In_3
In_2_1:cmp MaxLen,5
jl In_2_2
cmp dx,00
ja In_Err
cmp ah,0FFh
ja In_Err
jmp In_3
In_2_2:cmp ax,00FFh
jbe In_3
In_Err:LEA DX,erSTR3
MOV AH,09
INT 21H
mov erFlag,1
jmp In_5
In_3:cmp erFlag,1
jne In_4
mov bx,0
sub bx,ax
mov ax,bx
mov bx,0
sbb bx,dx
mov dx,bx
In_4: mov [di],ax
mov [di+2],dx
mov TempBin,0
mov TempBin+2,0
mov Mult10,1
mov Mult10+2,0
mov erFlag,0
In_5: RET
input_variable ENDP
CHECK_BYTE PROC
sub dl,30h
cmp dl,00
jl ErS
cmp dl,0Ah
jl GO
ErS: LEA DX,erS...